/**************************************************************************//**
 * @item     CosyOS-III Kernel
 * @file     sv_int_pend_flag.c
 * @brief    中断挂起服务_FLAG
 * @details  仅在 pendsv_hook 中调用并执行。
 * @author   迟凯峰
 * @version  V1.2.0
 * @date     2025.03.30
 ******************************************************************************/

#include "os_var.h"
#if MCUCFG_PENDSVFIFO_DEPTH \
 || SYSCFG_PENDSVHOOK == __ENABLED__
#include "sv_com.h"

/**
 @addtogroup CosyOS_内核服务
 @{
 *//**
 \defgroup   中断挂起服务_FLAG
 \brief      当需要在中断中完成特定的服务功能时，可先设置一个标志位，再触发 PendSV；
             而后在 pendsv_hook 中查询该标志位，为真就清除标志位，而后调用服务。
 @{
 */

/**
 \brief      恢复任务
 \param[in]  htask     任务句柄
 \return     无
 */
void sp_resume_task(s_tasknode_tsp htask) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status & OS_STATUS_SUSPENDED){
		sv_resume_task(htask);
	}
}

/**
 \brief      挂起任务
 \param[in]  htask     任务句柄
 \return     无
 */
void sp_suspend_task(s_tasknode_tsp htask) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status < OS_STATUS_SUSPENDED){
		sv_suspend_task(htask);
	}
}

/**
 \brief      删除任务
 \param[in]  htask     任务句柄
 \return     无
 */
void sp_delete_task(s_tasknode_tsp htask) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status < OS_STATUS_DELETED){
		sv_delete_task(htask);
	}
}

/**
 \brief      清除阻塞（状态）
 \param[in]  htask     任务句柄
 \return     无
 */
void sp_clear_block(s_tasknode_tsp htask) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status == OS_STATUS_BLOCKED){
		sv_clear_block(htask);
	}
}

/**
 \brief      设置阻塞（时间）
 \param[in]  htask     任务句柄
 \param[in]  tick      滴答周期（阻塞时间）<br>
             +0：清除阻塞<br>
             ~0：无限阻塞
 \return     无
 */
void sp_set_block(s_tasknode_tsp htask, s_delay_t tick) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status == OS_STATUS_BLOCKED){
		sv_set_block(htask, tick);
	}
}

/**
 \brief      设置任务优先级
 \param[in]  htask     任务句柄
 \param[in]  npri      新优先级
 \return     无
 */
void sp_set_taskpri(s_tasknode_tsp htask, s_u8_t npri) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status < OS_STATUS_STOPPED){
		if(htask->pri != npri){
			sv_set_taskpri(htask, npri);
		}
	}
}

#if SYSCFG_BINARY == __ENABLED__
/**
 \brief      写二值信号量
 \param[in]  hbin      二值信号量句柄
 \param[in]  value     <br>
             0：上锁<br>
             1：给予
 \return     无
 */
void sp_write_binary(s_binary_tsp hbin, bool value) MCUCFG_C51USING
{
	hbin->binary = value;
	if(!value) return;
	if(hbin->htask != OS_NULL){
		sv_delete_block_list(&hbin->htask);
	}
}
#endif

/** @} */
/** @} */
#endif
